iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

Lex & Yacc 學習筆記系列 第 29

[Day29] Yacc - Yacc Debug

  • 分享至 

  • xImage
  •  

本篇內容

  • 介紹 Yacc 的 debug 工具

Debug 工具介紹

YYDEBUG

我們在 [Day18] Yacc - Ambiguity and Conflicts 有提到,若是在 yacc 出現 conflict 訊息,可以透過下面的編譯指令來產出詳細的衝突訊息說明。

bison -v yacc.y

我們也可以在 yacc 程式中定義一個參數 YYDEBUG,一樣可以輸出衝突訊息到 yacc.output 檔案。

作法也很簡單,只要在 Definition 區塊將 YYDEBUG 的值設為 1。

%{

#define YYDEDUG 1

%}

編譯指令跟原本相同,不需要加 -v 。編譯完成後,yacc.output 檔案也生成出來。

yydebug

這裡的 yydebug 是小寫字樣,型別為 int 。這樣的寫法可以直接寫在C++程式裡面,而且可以比較彈性的更改數值。功能則跟大寫的 YYDEBUG 相似。

如果你把主程式寫在 Yacc 檔案中,可以這樣寫:

int main() {
    int result;
    yydebug = 1;

    result = yyparse();

    if (result == 0) {
        printf("Success\n");
    } else {
        printf("Fail\n");
    }

    return 0;
}

此處的 yydebug 不用再定義型別了。

如果主程式是寫在外部檔,抓不到 yydebug 的話,可以試著 extern 看看。

結語

到此,我們終於完成了 Lex & Yacc 的所有內容了~

非常感謝一路看到這裡的你,若是有遇到任何疑問,或是文章內容有誤,都歡迎與我聯繫!

參考資料

  • Levine, John R., Tony Mason and Doug Brown [1992]. Lex & Yacc. O’Reilly & Associates, Inc. Sebastopol, California.
  • Tom Niemann. Lex & Yacc

上一篇
[Day28] Yacc - Command Line輸入
下一篇
[Day30] 完賽心得
系列文
Lex & Yacc 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言